package com.sky.d_thread;
/**
 * visibility 美[ˌvɪzəˈbɪlɪti]
 * 可见性;能见度
 * 
 * Java虚拟机层面的可见性
 * 现在系统多为两核以上的处理器，不同寄存器处理任务的时候，相互之间的数据的一致或说可见性在复杂的情况下需要考虑的
 * 
 * @Author:hjt
 */
public class VisibilityDemo extends Thread {
	
//	private volatile boolean stop;
	private boolean stop;
	
	@Override
	public void run() {
		int i = 0;
		while (!stop){
			i ++; 
		}
		System.out.println("finish loop,i = " + i);
	}

	public boolean isStop() {
		return stop;
	}

	public void setStop(boolean stop) {
		this.stop = stop;
	}
	
	public static void main(String[] args) throws InterruptedException {
		VisibilityDemo v = new VisibilityDemo();
		v.start();
		
		Thread.sleep(1000);
		
		//main线程修改stop状态 对于VisibilityDemo线程是不可见的
		// v进入run方法运行之后，stop读取一次之后一直在while中，不再去读stop
		//加上volatile可以解决:保证stop的写操作优先与读操作,while每次执行的时候会去读stop
		v.setStop(true);
		
		Thread.sleep(2000);
		
		System.out.println("finish main");
		System.out.println(v.isStop());
	}
}
